﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json; 

namespace RevitProject.SpaceManager.Converters
{
    public static class CategoryCsvConverter
    {
        /// <summary>
        /// 用于表示 JSON 分类结构中节点的内部类。
        /// </summary>
        private class JsonCategoryNode
        {
            [JsonProperty("Name")]
            public string Name { get; set; }

            [JsonProperty("Children")]
            public List<JsonCategoryNode> Children { get; set; }
        }

        /// <summary>
        /// 将表示分类树的 JSON 字符串转换为 CSV 字符串，
        /// 该 CSV 仅包含叶节点名称，适用于 ImportSpaceTypesCommand。
        /// </summary>
        /// <param name="jsonString">输入的 JSON 字符串。</param>
        /// <param name="csvHeaders">可选：指定 CSV 的表头。默认为仅包含 "Name"。</param>
        /// <returns>CSV 格式的字符串，如果发生错误则返回 null。</returns>
        public static string ConvertJsonToSpaceTypeCsv(string jsonString, string[] csvHeaders = null)
        {
            if (string.IsNullOrWhiteSpace(jsonString))
            {
                Console.Error.WriteLine("错误：输入的 JSON 字符串为 null 或空。");
                return null;
            }

            // 如果未提供表头，则使用默认表头
            if (csvHeaders == null || csvHeaders.Length == 0)
            {
                csvHeaders = new[] { "Name" };
            }
            else if (!csvHeaders.Contains("Name", StringComparer.OrdinalIgnoreCase))
            {
                Console.Error.WriteLine("错误：csvHeaders 必须包含 'Name' 列。");
                return null; // Name 列是强制性的
            }

            List<JsonCategoryNode> rootNodes;
            try
            {
                // JSON 是一个包含单个根对象的数组
                var parsedJson = JsonConvert.DeserializeObject<List<JsonCategoryNode>>(jsonString);
                if (parsedJson == null || parsedJson.Count == 0)
                {
                    Console.Error.WriteLine("错误：解析 JSON 失败或 JSON 根为空。");
                    return null;
                }
                // 我们期望实际的分类在 "全部房间" 节点下
                rootNodes = parsedJson[0]?.Children; // 获取 "全部房间" 的子节点
                if (rootNodes == null)
                {
                    Console.Error.WriteLine("错误：JSON 结构无效。期望根元素下有子节点。");
                    return null;
                }
            }
            catch (JsonException jsonEx)
            {
                Console.Error.WriteLine($"解析 JSON 时出错: {jsonEx.Message}");
                return null;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine($"JSON 解析期间发生意外错误: {ex.Message}");
                return null;
            }


            var leafNodeNames = new List<string>();
            ExtractLeafNamesRecursive(rootNodes, leafNodeNames);

            if (!leafNodeNames.Any())
            {
                Console.WriteLine("警告：在提供的 JSON 结构中未找到叶节点。");
                // 返回只有表头的空 CSV？或者 null？我们返回仅包含表头的CSV。
            }

            // 构建 CSV 字符串
            StringBuilder csvBuilder = new StringBuilder();

            // 添加表头行
            csvBuilder.AppendLine(string.Join(",", csvHeaders));

            // 为每个叶节点添加数据行
            // 使用 Distinct() 去重，并用 OrderBy() 排序
            foreach (string name in leafNodeNames.Distinct().OrderBy(n => n))
            {
                // 创建一个包含名称和其他列空值的行
                var rowValues = new string[csvHeaders.Length];
                // 查找 "Name" 列的索引（忽略大小写）
                int nameIndex = Array.FindIndex(csvHeaders, h => h.Equals("Name", StringComparison.OrdinalIgnoreCase));

                for (int i = 0; i < rowValues.Length; i++)
                {
                    if (i == nameIndex)
                    {
                        // 处理名称本身可能包含的逗号或引号（基本的 CSV 转义）
                        rowValues[i] = EscapeCsvField(name);
                    }
                    else
                    {
                        rowValues[i] = ""; // 其他列为空字符串
                    }
                }
                csvBuilder.AppendLine(string.Join(",", rowValues));
            }

            return csvBuilder.ToString();
        }

        /// <summary>
        /// 递归辅助函数，用于遍历节点树并收集叶节点的名称。
        /// </summary>
        private static void ExtractLeafNamesRecursive(List<JsonCategoryNode> nodes, List<string> leafNames)
        {
            if (nodes == null) return;

            foreach (var node in nodes)
            {
                if (node == null || string.IsNullOrWhiteSpace(node.Name)) continue;

                // 检查是否是叶节点（没有子节点或子节点列表为空）
                bool isLeaf = node.Children == null || !node.Children.Any();

                if (isLeaf)
                {
                    // 添加叶节点的名称
                    leafNames.Add(node.Name);
                }
                else
                {
                    // 如果不是叶节点，则递归处理其子节点
                    ExtractLeafNamesRecursive(node.Children, leafNames);
                }
            }
        }

        /// <summary>
        /// 为 CSV 格式转义字符串字段（基本实现）。
        /// 如果字段包含逗号、引号或换行符，则用引号包裹。对现有引号进行转义。
        /// </summary>
        private static string EscapeCsvField(string field)
        {
            if (field == null) return "";
            // 检查是否需要转义
            if (field.Contains(",") || field.Contains("\"") || field.Contains("\n") || field.Contains("\r"))
            {
                // 通过将双引号加倍来转义，并将整个字段用双引号包裹起来
                return $"\"{field.Replace("\"", "\"\"")}\"";
            }
            return field;
        }

        // --- 使用示例 ---
        public static void GenerateCsvFileExample(string jsonInput, string outputFilePath)
        {
            // 定义所需的 CSV 表头，包括导入器所需的可选列
            string[] headers = {
                 "Name",
                 "IsPlenum", // 示例可选列
                 "AreaPerPerson_m2_person",
                 "LightingLoadDensity_W_m2",
                 "PowerLoadDensity_W_m2",
                 "SensibleHeatGainPerPerson_W",
                 "LatentHeatGainPerPerson_W",
                 "HeatingSetpoint_C",
                 "CoolingSetpoint_C"
             };

            string csvContent = ConvertJsonToSpaceTypeCsv(jsonInput, headers);

            if (csvContent != null)
            {
                try
                {
                    // 将 CSV 内容写入指定文件，使用带 BOM 的 UTF-8 编码
                    // (字节顺序标记 BOM 通常有助于 Excel 兼容性)
                    System.IO.File.WriteAllText(outputFilePath, csvContent, new UTF8Encoding(true));
                    Console.WriteLine($"成功生成 CSV 文件: {outputFilePath}");
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine($"写入 CSV 文件时出错: {ex.Message}");
                }
            }
            else
            {
                Console.Error.WriteLine("生成 CSV 内容失败。");
            }
        }
    }
}